package com.mydemo.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.ToolResponseMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;

@RestController
public class ChatPromptController {

    /**
     * clent 模式 链式调用 流式返回
     */
    @Resource(name="qwenChatClient")
    private ChatClient qwenClient;


    @GetMapping(value = "/clientPrompt")
    public Flux<String> clientPrompt(@RequestParam(name="msg") String msg){
        Flux<String> result = qwenClient.prompt(msg)
                .system("你是一个法律助手，你只能回答与法律相关的问题，其它问题，你只回复，抱歉，我只是一个法律助手，其它问题无可奉告")
                .user(msg)
                .stream().content();
        return result;
    }


    /**
     * model 模式 中规中矩 样板调用  流式返回
     */
    @Resource(name="qwen")
    private ChatModel qwenModel;

    @GetMapping("/modelPrompt")
    public Flux<ChatResponse> modelPrompt(@RequestParam(name="msg") String msg){

        UserMessage userMessage = new UserMessage(msg);

        SystemMessage systemMessage = new SystemMessage("你是一个美食专家，你会解答用户关于菜品的制作，对于其它问题，你只能回到，抱歉，这个不在你的知识范围内");

        Prompt prompt = new Prompt(systemMessage, userMessage);

        return qwenModel.stream(prompt);
    }

    /**
     *         Flux<ChatResponse> --> Flux<String> 使用 map 获取 ChatResponse 里面的内容
     *     qwenModel.stream(prompt).map(response->response.getResults().get(0).getOutput().getText())
     * @param msg
     * @return
     */
    @GetMapping("/modelPrompt2")
    public Flux<String> modelPrompt2(@RequestParam(name="msg") String msg){

        UserMessage userMessage = new UserMessage(msg);

        SystemMessage systemMessage = new SystemMessage("你是一个美食专家，你会解答用户关于菜品的制作，对于其它问题，你只能回到，抱歉，这个不在你的知识范围内");

        Prompt prompt = new Prompt(systemMessage, userMessage);

        return qwenModel.stream(prompt).map(response->response.getResults().get(0).getOutput().getText());
    }

    /**
     * 获取 AssistantMessage  大模型响应的内容
     * @param msg
     * @return
     */
    @GetMapping("/assistantMessagePrompt")
    public String assistantMessagePrompt(String msg){
        AssistantMessage assistantMessage = qwenClient.prompt()
                .user(msg)
                .call()
                .chatResponse()
                .getResult()
                .getOutput();
       return assistantMessage.getText();
    }

    @GetMapping("/toolsPrompt")
    public String toolsPrompt(String city){
        String ans = qwenClient.prompt()
                .user(city+" 未来三天天气情况")
                .call()
                .chatResponse()
                .getResult()
                .getOutput().getText();

        ToolResponseMessage toolResponseMessage = new ToolResponseMessage(
                List.of(new ToolResponseMessage.ToolResponse("1","获得天气",city)));

        String toolResponse=toolResponseMessage.getText();

        String result=toolResponse+ans;

        return result;
    }


}
